"""
执行测算页面
"""
import streamlit as st
from ai.model_factory import ModelFactory
from ai.prompt_templates import CALCULATION_PROMPT
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from models.scene import Scene


def show():
    """
    显示执行测算页面
    """
    st.title("执行测算")
    
    # 检查数据准备状态
    if "transformed_data" not in st.session_state:
        st.warning("请先完成数据准备")
        return
    
    # 显示当前场景
    if "current_scene" not in st.session_state:
        st.warning("请先选择或创建测算场景")
        return
    
    scene = st.session_state.current_scene
    st.subheader(f"当前场景: {scene.name}")
    st.write(f"类型: {scene.scene_type}")
    st.write(f"描述: {scene.description}")
    
    # 显示已配置参数
    st.subheader("参数配置")
    if "parameters" not in st.session_state:
        st.warning("请先配置参数")
    else:
        st.json(st.session_state.parameters)
    
    # 显示准备数据
    st.subheader("准备数据")
    st.dataframe(st.session_state.transformed_data)
    
    # 测算配置
    st.subheader("测算配置")
    calculation_mode = st.selectbox(
        "测算模式",
        options=["标准模式", "高级模式", "自定义模式"]
    )
    
    # 执行测算
    if st.button("开始测算"):
        with st.spinner("测算中..."):
            # 初始化模型
            model = ModelFactory().get_model("chatgpt")
            
            # 创建测算链
            prompt = PromptTemplate(
                input_variables=["scene", "data", "parameters", "mode"],
                template=CALCULATION_PROMPT
            )
            chain = LLMChain(llm=model, prompt=prompt)
            
            # 执行测算
            result = chain.run(
                scene=scene,
                data=st.session_state.transformed_data,
                parameters=st.session_state.parameters,
                mode=calculation_mode
            )
            
            st.session_state.calculation_result = result
            st.success("测算完成！")
            st.balloons()
    
    # 显示测算结果
    if "calculation_result" in st.session_state:
        st.subheader("测算结果")
        st.json(st.session_state.calculation_result)